import { readFile } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import { dirname, join } from 'node:path'

//将 CommonJS 模块转换为 ES6 模块，以便 Rollup 可以处理
import commonjs from '@rollup/plugin-commonjs'
// 用于解析第三方模块
import { nodeResolve } from '@rollup/plugin-node-resolve'
// 用于压缩和混淆打包后的代码
import { terser } from 'rollup-plugin-terser'
// 集成 Babel，将 ES6+ 代码转换为向后兼容的 JavaScript 代码
import babel from '@rollup/plugin-babel'
import del from 'rollup-plugin-delete'
import image from '@rollup/plugin-image'
//将JSON文件作为模块导入到JavaScript代码
import json from 'rollup-plugin-json'
import dayjs from 'dayjs'

const _filename = fileURLToPath(import.meta.url)
const _dirname = dirname(_filename)
const prod_env = process.env.NODE_ENV === 'production'

export default packageConfig()

async function packageConfig () {
  const bannerConfig = await addBannerConfig()
  return {
    input: 'src/main.js',
    external: ['CsmMap'],
    plugins: [
      del({ targets: 'lib/*' }),
      image(), // 处理图片文件
      commonjs(),
      babel({
        exclude: 'node_modules/**', // 防止打包node_modules下的文件
        babelHelpers: 'runtime', // 使用 runtime 方案
      }),
      json(), // 处理JSON文件
      nodeResolve(),
      prod_env && terser()
    ],
    output: {
      file: 'lib/csmMap.min.js',
      // es:适用于现代浏览器或Node.js环境
      // iife:生成一个匿名闭包，适合直接嵌入HTML页面
      // cjs:适用于Node.js环境
      // umd:同时兼容CommonJS、AMD和全局变量
      // amd: 适用于RequireJS等AMD加载器
      format: 'umd',
      name: 'CsmMap', // 指定模块的全局变量名称
      sourcemap: true,
      globals: { // 定义这些外部依赖在运行时的全局变量名称
        CsmMap: 'CsmMap'
      },
      // external: 声明哪些模块是外部依赖，不会被打包进最终文件
      compact: true,// Rollup 会生成更紧凑的代码，减少空白字符以优化文件大小
      ...bannerConfig
    }
  }
}


/**
 * @description 添加注释
 * @returns {Object} {banner,footer}
 */
async function addBannerConfig () {
  const filePath = join(_dirname, 'package.json')
  const packageJson = await readFile(filePath, 'utf8')
  const { version, repository } = JSON.parse(packageJson)

  // 设置头部注释信息
  const banner =
    '/*!\n' +
    ` * CsmMap -${repository.url} \n` +
    ` * Version v${version}\n` +
    ` * (c) ${dayjs().format('YYYY-MM-DD HH:mm:ss')}  \n` +
    ' * Released under the MIT License.\n' +
    ' */'

  // 设置尾部注释信息
  const footer = `/** ${new Date()} **/`
  return {
    banner,
    footer,
  }
}